package com.example.blog.controller;

import com.example.blog.constants.Constant;
import com.example.blog.model.Blog;
import com.example.blog.model.Result;
import com.example.blog.model.UserInfo;
import com.example.blog.service.BlogService;
import com.example.blog.service.UserInfoService;
import com.example.blog.utils.JwtUtil;
import com.example.blog.utils.SecurityUtil;
import io.jsonwebtoken.Claims;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@Slf4j
@RestController
@RequestMapping("/user")
public class UserInfoController {
    @Autowired
    private UserInfoService userInfoService;

    @Autowired
    private BlogService blogService;

    @RequestMapping("/login")
    public Result<Object> login(String userName, String password, HttpSession session){
        // 1. 校验参数
        log.info("/user/login接收到参数 userName = {}, password = {}", userName, password);
        if(!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)){
            log.error("用户名或密码为空");
            return Result.failure("用户名或密码为空");
        }
        // 2. 根据用户名获取用户信息
        UserInfo userInfo = userInfoService.selectUserInfoByName(userName);
        if(userInfo == null){
            log.error("用户不存在");
            return Result.failure("用户不存在");
        }
        // 3. 校验用户密码
        if(!SecurityUtil.verify(password, userInfo.getPassword())){
            log.error("密码错误");
            return Result.failure("密码错误");
        }
//        if(!password.equals(userInfo.getPassword())){
//            log.error("密码错误");
//            return Result.failure("密码错误");
//        }
//         4. 存储用户信息到会话中
//        userInfo.setPassword("");
//        session.setAttribute(Constant.SESSION_USERINFO_KEY, userInfo);

        // 4. 生成 token
        Map<String, Object> claim = new HashMap<>();
        claim.put(Constant.TOKEN_USER_ID, userInfo.getId());
        claim.put(Constant.TOKEN_USER_NAME, userInfo.getUserName());
        String token = JwtUtil.genJwtToken(claim);

        // 5. 每次登录后都更新数据库 password 列的值
        Integer updateResult = userInfoService.updatePssword(SecurityUtil.encrypt(password), userInfo.getId());

//        return Result.success(true);
        return Result.success(token);
    }

    @RequestMapping("/getUserInfoById")
    public UserInfo getUserInfoById(HttpServletRequest request){
        // 1. 从 token 中获取用户信息
        String token = request.getHeader(Constant.USER_LOGIN_TOKEN);
        Claims claims = JwtUtil.verifyJwt(token);

        Integer id = (Integer) claims.get(Constant.TOKEN_USER_ID);
        // 2. 获取用户信息
        UserInfo userInfo = userInfoService.selectUserInfoById(id);
        if(userInfo == null){
            log.error("查询异常");
            return null;
        }
        // 3. 获取博客数量
        Integer userId = userInfo.getId();
        Integer total = blogService.count(userId);
        userInfo.setTotalBlog(total);
        log.info("/user/getUserInfoById返回结果 userInfo: {}", userInfo);
        return userInfo;
    }

    @RequestMapping("/getAuthorInfoByBlogId")
    public UserInfo getAuthorInfoByBlogId(Integer id, HttpServletRequest request){
        // 1. 参数校验
        log.info("/user/getAuthorInfoByBlogId接收到参数 blogId: {}", id);
        if(id == null || id <= 0){
            log.error("输入参数不合法");
            return null;
        }
        // 2. 根据博客 ID　获取博客信息
        Blog blog = blogService.selectBlogById(id);
        if(blog == null){
            log.error("获取博客信息失败");
            return null;
        }
        // 3. 根据博客信息获取作者 id
        Integer userId = blog.getUserId();
        if(userId == null || userId <= 0){
            log.error("用户 ID 不合法");
            return null;
        }
        // 4. 根据作者 id，获取作者信息
        UserInfo userInfo = userInfoService.selectUserInfoById(userId);
        if(userInfo == null){
            log.error("获取用户信息失败");
            return null;
        }
        // 5. 对比作者的 id 和当前登录用户的 id
        //    如果相同告诉前端显示编辑和删除按钮，不相同要隐藏编辑和删除按钮
        String token = request.getHeader(Constant.USER_LOGIN_TOKEN);
        Integer currentUserId = JwtUtil.getCurrentUserIdByToken(token);
        if(currentUserId != null && currentUserId.equals(userInfo.getId())){
            // 是同一个用户
            userInfo.setIsSameUser(true);
        }else{
            // 不是同一个用户
            userInfo.setIsSameUser(false);
        }
        // 6. 根据作者 id 获取作者博客数量
        Integer total = blogService.count(userId);
        userInfo.setTotalBlog(total);

        return userInfo;
    }
}
